package eightDataType.mStr;
import org.junit.Test;
import utils.PrintUtil;

import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
import java.util.Arrays;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.TreeMap;
import java.util.TreeSet;

import javax.swing.plaf.metal.MetalIconFactory.FolderIcon16;
import javax.xml.transform.Source;

/**
 *
 * string 内存打字奥
 */
public class StringDemo {
StringBuffer sb = new StringBuffer();
StringBuilder sb2 = new StringBuilder();


	public static void main(String[] args) {

		//测试 (String)null 强转
		int av = 80;
//		String avStr = (String) av;//java: 不兼容的类型: int无法转换为java.lang.String
		String s1 = String.valueOf(av);

		Object oNull = null;
		String s2 = String.valueOf(oNull);
		System.out.println("StringDemo:main:s2:"+s2 +(">>>")+ "null".equals(s2));

		String oNull1 = (String) oNull;
		System.out.println("StringDemo:main:(String) oNull>>>"+oNull1+(">>>")+ "null".equals(s2));
	//测试 (String)null 强转 over


		String origin = "abc_123_456";
//		String origin = "abc456";
		String[] s = origin.split("_123_");
		PrintUtil.print(s);
//		int i = origin.indexOf("_123_");
//		System.out.println("StringDemo:main:index:"+i);//-1
//		String substring = origin.substring(i + 5);
//		System.out.println("StringDemo:main:"+substring);


		System.out.println("StringDemo:main:contains:::"+("abcdef".contains("bcd")));
	  String abc = getName();
		System.out.println("abc:"+abc);
	}

	private static String getName() {
		return null;
	}

	@Test
	public void main() throws UnsupportedEncodingException {

		String testStrMaxLength =  "";//超长，提示过长。已测试 2021-04-20 14:43:34

		String res = URLEncoder.encode("₤fclU1kGcwFq₤", "utf-8");
		System.out.println("res: "+res);

//	String value = "49 57 51 53 50 49 46 54 52 49 ";
	String value = "20191129001";

	  StringBuffer sbu = new StringBuffer();

	  String[] chars = value.split("");
	  for (int i = 0; i < chars.length; i++) {

	    sbu.append((char) Integer.parseInt(chars[i]));
	  }
	 System.out.println("--》 "+sbu.toString());

		byte[] bytes = "20191129001".getBytes();
		PrintUtil.print(bytes);
		System.out.println("---> ");


	String photoPath = 	"/sdcard/beeboxes/assets/passable_photo.jpeg";
		String imgtype = "png";
		if (photoPath != null && photoPath.length()>0) {
			if (photoPath.contains(".")){
				imgtype = photoPath.substring(photoPath.lastIndexOf(".")+1,photoPath.length());
			}
		}
		System.out.println("img type =="+imgtype);
		String string = " a ";
		
		System.out.println(string.trim());
		System.out.println(string.trim().length());
//		formatReplace();

//		strSplit();
		
//		oneHudredNumStr();
//		strSub();
//		strExceptRepeat();
		memoryAny();
	}

	/**
	 * 在 Java 里数组也是对象，因而数组也有对象头，故一个数组所占的空间为对象头所占的空间加上数组长度加上数组的引用，即 8 + 4 + 4= 16字节 。
	 *
	 * 那么一个空 String 所占空间为：
	 *
	 * 对象头（8 字节）+ 引用 (4 字节 ) + char 数组（16 字节）+ 1个 int（4字节）+ 1个long（8字节）= 40 字节。
	 *
	 * String占用内存计算公式：40 + 2*n，n为字符串长度。
	 *
	 * 1mb = 1024 kb
	 * 1kb = 1024 byte
	 * ---------------------
	 *
	 * 4,000,000条String，每条长度为32。
	 *
	 * 若上述分析合理，则保存字符串需要消耗内存为(64 + 40) * 4000000 ≈ 416M。
	 *
	 * 作者：mafei6827
	 * 来源：CSDN
	 * 原文：https://blog.csdn.net/mafei6827/article/details/87076371
	 * 版权声明：本文为博主原创文章，转载请附上博文链接！
	 */
	private static void memoryAny() {

	}

	//去重
	@Test
	public void strExceptRepeat() {
		String a="a";
		String b="bc";
		String c="a";
		String d="d";
		String e="dc";
		String f="ef";
		TreeSet<String> set=new TreeSet<>();
//		set.add(null);//java.lang.NullPointerException
		set.add(a);
		set.add(b);
		set.add(c);
		set.add(d);
		set.add(e);
		set.add(f);
		Object[] array =  set.toArray();
		for (int i = 0; i < array.length; i++) {
			System.out.println("array =="+(String)array[i]);
		}
		Iterator<String> iterator = set.iterator();
	
		while (iterator.hasNext()) {
			String next = iterator.next();
			System.out.println(next);
			
		}
	}

	@Test
	public void oneHudredNumStr() {
		String abc ="1,2,0,0,0";
		String[] split = abc.split(",");
		System.out.println("---"+split.length);
		for (String string : split) {
			System.out.println(string);
		}
		
		int[] numCount=new int[split.length];
		for (int i = 0; i < split.length; i++) {
			numCount[0]++;
		}
		for (int i : numCount) {
			System.err.println(i);
		}
		System.out.println(numCount);
//		for (int i = 0; i < 5; i++) {
//			
//		}
		
	}

	//todo .  str.lastIndexOf . 不需要加 转义符。
	/**
	 *
	 */
	@Test
	public void strSub() {
		String strSub = "abc.def.ghi";
		System.out.println("strSub.lastIndexOf(\".\"):  "+strSub.lastIndexOf("."));
		System.out.println("strSub.lastIndexOf(\"\\\\.\"):  "+strSub.lastIndexOf("\\."));//todo .  str.lastIndexOf . 不需要加 转义符。
		System.out.println("strSub.substring(strSub.lastIndexOf(\".\"))  :"+strSub.substring(strSub.lastIndexOf(".")));
		System.out.println("strSub.substring(strSub.lastIndexOf(\".\"))  :"+strSub.substring(strSub.lastIndexOf(".")+1));

		String[] split1 = strSub.split("\\.");
		System.out.println("strSub.split(\"\\\\.\") length:"+split1.length);

		String[] split2 = strSub.split(".");
		System.out.println("strSub.split(\".\") length:"+split2.length);//todo str.split \\. 需要加 转义符

		String sss="-aaa-bbb-ccc-";
		System.out.println("123===  "+sss.substring(0 ,1));
//		String sss=" ";
		String[] split = sss.split("-");
		System.out.println("1split.length==="+split.length);
		System.out.println("2split.length==="+(split[0].length()));
		System.out.println("3split.length==="+(split[0]));
		int lastIndexOf2 = sss.lastIndexOf("-");
		System.out.println(lastIndexOf2);
		System.out.println("lastIndexOf===="+sss.substring(0, sss.lastIndexOf("-")));
//		System.out.println(sss.substring(sss.length()-3,sss.length()));
		String s1=sss.substring(0,sss.lastIndexOf("-"));
		System.out.println(s1);
		String lastName="abc.jpg";
		// 获取后缀名
		if (lastName.contains(".")) {
			int lastIndexOf = lastName.lastIndexOf(".");
			String substring = lastName.substring(lastIndexOf);
			System.out.println(lastIndexOf+"===lastName==="+substring);
		}
		

		StringBuffer sb = new StringBuffer();
		sb.append("abcdef,s,344,fsf");
		// 去末尾逗号
		String s = sb.toString();
		if (s.length() > 0) {
			if (s.substring(s.length() - 1, s.length()).equals(",")) {
				s = s.substring(0, s.length() - 1);
			}
		}
		System.out.println("-- "+s);

		String name = "sfaf,";
		if (name.length() > 0) {
			System.out.println(name.substring(name.length() - 1, name.length()));// 输出d
			System.out.println(name.substring(0, name.length() - 1));
		}

		String webTitle = "sa&t";
		if (webTitle != null && webTitle.contains("&")) {
			String shareTitle = webTitle.substring(0, webTitle.indexOf("&"));
			System.out.println(shareTitle);
		}
	}

	//todo str.split \\. 需要加 转义符
	/**
	 * 	//1、如果用“.”作为分隔的话,必须是如下写法,String.split("\\."),这样才能正确的分隔开,不能用String.split(".");
	 *
	 * //2、如果用“|”作为分隔的话,必须是如下写法,String.split("\\|"),这样才能正确的分隔开,不能用String.split("|");
	 * //
	 * //“.”和“|”都是转义字符,必须得加"\\";
	 * //
	 * //3、如果在一个字符串中有多个分隔符,可以用“|”作为连字符,比如,“acount=? and uu =? or n=?”,把三个都分隔出来,可以用String.split("and|or");
	 * //
	 * //使用String.split方法分隔字符串时,分隔符如果用到一些特殊字符,可能会得不到我们预期的结果。
	 * 	//拆分
	 */
	@Test
	public void strSplit() {
		String str = "abc:def";
		String[] split = str.split(":");
		System.out.println("str.split(\":\") length:"+split.length);
		System.out.println("str.split(\":\") length:"+split[0]+"  "+split[1]);


		String strSub = "abc.def.ghi";

		String[] split1 = strSub.split("\\.");
		System.out.println("strSub.split(\"\\\\.\") length:"+split1.length);

		String[] split2 = strSub.split(".");
		System.out.println("strSub.split(\".\") length:"+split2.length);//todo str.split \\. 需要加 转义符

//		splitSpecialPoint();
		//System.out.println(frStr.indexOf("."));
//		 System.out.println(split[0]);
//		 System.out.println(split[1].length());
//		   String substring = frStr.substring(frStr.indexOf("."), split[1].length()>2?3:split[1].length());
//         String substring = frStr.substring(frStr.indexOf("."), split[1].length()>2?3:split[1].length());
		
//		String str = "abc,def;gh,ij;k;lm,no,p;qr,st";
//		String[] temp = str.split("[,;]");
//		System.out.println(Arrays.toString(temp));

//		String abc="abc  "+"\n"+"\n"+"bcd";
//		\n 匹配换行符
//		\r 匹配回车符
		String abc="abc  "+"\n"+"\r"+"\n"+"bcd";
		String[] ss = abc.split("\n|\r");
		for (int i = 0; i < ss.length; i++) {
			System.out.println(i+"---ss-"+ss[i]+"  " +ss[i].length());
		}
	}

	/**
	 * 截取特殊符号
	 */
	private static void splitSpecialPoint() {
//		String str_=",样地编号重复,,T3,";
//		String str_="abccc,  , bcdddd";
		String str_="";
		String[] split2 = str_.split("\\,");
		System.out.println("str_.contains(\",\")=="+str_.contains(","));
		for (int i = 0; i < split2.length; i++) {
//			System.err.println(i+" length=="+split2[i].trim().length());
			
			if (split2[i]==null||split2[i].length()==0) {
				System.err.println(i+"split by ,  null"+split2[i]);
			}else {
				System.err.println(i+"split by ,  "+split2[i] +"   length=="+split2[i].length());
			}
		}
		
//		String str_="_样地编号重复_T3_";
//		String[] split2 = str_.split("\\_");
//		for (int i = 0; i < split2.length; i++) {
//			if (split2[i]==null||split2[i].length()==0) {
//				
//			}else {
//				
//				System.err.println(i+"split by _  "+split2[i]);
//			}
//		}
//		
		System.out.println("-----");
		
//		String frStr="8000.0";
//		System.out.println(frStr.indexOf("."));
////		System.out.println(frStr.indexOf("\\."));
//		String[] split = frStr.toString().split("\\.");
//		int a=split[1].length()>2 ? 3 : split[1].length();
//		System.err.println(a+"");
//		String substring = frStr.substring(frStr.indexOf("."), frStr.indexOf(".")+a+1);
//		System.err.println(substring);
	}



	/**
	 * string  替换技巧  
	 * %d   （表示整数）
	%f    （表示浮点数）
	%s   （表示字符串）
	%n$ms：代表输出的是字符串，n代表是第几个参数，设置m的值可以在输出之前放置空格 
	%n$md：代表输出的是整数，n代表是第几个参数，设置m的值可以在输出之前放置空格，也可以设为0m,在输出之前放置m个0 
	%n$mf：代表输出的是浮点数，n代表是第几个参数，设置m的值可以控制小数位数，如m=2.2时，输出格式为00.00 
	
	如果不指明n那么顺序排下
	 */
	@Test
	public void formatReplace() {
		String ff= String.format("%.2f" ,1111F);//保留2位小数
		System.out.println("%f  ==="+ff);
		String format = String.format("onStartGatherCallback, errorNo:%d, message:%s ", 1111, "222");
		// String format2 = String.format("：：:%1$d, ,%2$d,,message:%1$s --message:%4$s
		// ", 1111, 2232, "222", "343");
		String format2 = String.format("：：:%d, ,%d,,message:%s --message:%s ", 1111, 2232, "222", "343");
//		System.err.println(format2);
		 String format3 = String.format("：：:%1$2d, ,%2$2.3f,,message:%3$3s --message:%4$s", 1111, 22322f, "222", "343");
		 System.out.println(format3);
	}

}
